package com;

/**
 * 线程同步:
 * 		当多个线程操作同一个人数据的时候保证数据的一致性线程同步主要是为了数据同步,是一种安全措施
 * 
 * 异步编程:
 * 		线程是完全独立的,谁的运行也不会影响到别人
 * 
 * 同步编程 : 
 * 		线程之间不是独立的,相互之间有影响,某些现线程必须单股完成任务以后,才能让其他线程执行
 * 
 * 同步原因 :
 * 		1.数据同步,为了数据安全
 * 		2.同步条件
 * 			1必须多线程(必须有并发性)
 * 			2多个线程有可能同时操作同一个数据的可能性
 * 			3主要是数据的更改
 * 
 * 主要使用 synchronized 修饰,该方法就不能同时被访问
 * 
 * @author lenovo
 * @date 2020年7月24日
 */
public class Thread_07_Synchronization {

	public static void main(String[] args) {
		Account act = new Account(3000);
		Thread t1 = new Processor9(act);
		Thread t2 = new Processor9(act);
		t1.setName("t1");
		t2.setName("t1");
		t1.start();
		t2.start();
	}

}

class Processor9 extends Thread {
	Account act;

	public Processor9(Account act) {
		this.act = act;
	}

	@Override
	public void run() {
		act.withDraw(1000);
		// --------------
//		System.out.println(Thread.currentThread().getName()
//				+ " 取钱成功,取钱1000元 剩余 : " +act.getBalance());
	}
}

class Account {
	private double balance;

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}

	public Account(double balance) {
		this.balance = balance;
	}

	// 取钱方法
	public synchronized void withDraw(double money) {
		// 写在方法中就会正常执行
		balance = balance - money;
		System.out.println(Thread.currentThread().getName() + " 取钱成功,取钱1000元 剩余 : " + balance);

	}
}